#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//函数指针数组：是一个数组，它里面存放的是函数指针
//它可以由函数指针去进行记忆
//void (*pf)(int,int)=&Add;
//void (*pf[10])(int,int);去掉pf[10]以后剩下void (*)(int ,int)
//就是函数指针数组的类型

//int Add(int x, int y)
//{
//	return x + y;
//}
//
//int Sub(int x, int y)
//{
//	return x - y;
//}
//
//int Mul(int x, int y)
//{
//	return x * y;
//}
//
//int Div(int x, int y)
//{
//	return x / y;
//}
//
//void menu()
//{
//	printf("***1.add  2.sub***\n");
//	printf("***3.mul  4.div***\n");
//	printf("***0.exit***\n");
//	printf("********************\n");
//}
//int main()
//{
//	int input = 0;
//	int x = 0;
//	int y = 0;
//	int ret = 0;
//	int (*pf[5])(int, int) = { NULL,&Add,&Sub,&Mul,&Div };
//	do
//	{
//		menu();
//		printf("请选择运算>:\n");
//		scanf("%d", &input);
//
//		if (input == 0)
//		{
//			printf("退出计算器");
//			//break;
//		}
//		else if (input >= 1 && input <= 4)
//		{
//			printf("请输入两个操作数>:\n");
//			scanf("%d %d", &x, &y);
//			ret = pf[input](x, y);//调用函数指针数组
//			printf("%d\n", ret);
//		}
//		else
//		{
//			printf("输入错误，请重新输入\n");
//			//break;
//		}
//
//
//	} while (input);
//	return 0;
//}


//转移表是一个数组

//指向函数指针数组的指针
//从函数指针数组开始去看待这个指向函数指针数组的指针
//int (*pf)[int,int] 函数指针
//int (*pf[10])[int,int] 函数指针数组，去掉pf[10],就是函数指针数组的类型
// 
//指向函数指针数组的指针  int (*(*pf)[10])[int,int],指向一个数组，数组的元素是
//向外一看，也就是右边，指向的是一个数组，数组的元素是函数指针，把
//（*pf）[10]去掉，剩下int (*)[int,int]是函数指针，pf的类型为去掉pf之后的所有
//int (*(*)[10])[int,int]


//要写出指向函数指针数组的指针，先写函数指针，再写函数指针数组，最后写指向函数
//指针数组的指针
void cale( int (*pf)(int,int))//形参是一个函数指针，这个指针可以指向一个函数
//这个相当于调用函数
{
	int x = 0;
	int y = 0;
	int ret = 0;
	printf("输入操作数：");
	scanf("%d %d", &x, &y);
	ret = pf(x, y);
	printf("ret = %d\n", ret);
}
int Add(int x, int y)
{
	return x + y;
}

int Sub(int x, int y)
{
	return x - y;
}

int Mul(int x, int y)
{
	return x * y;
}

int Div(int x, int y)
{
	return x / y;
}

void menu()
{
	printf("***1.add  2.sub***\n");
	printf("***3.mul  4.div***\n");
	printf("***0.exit***\n");
	printf("********************\n");
}
int main()
{
	int input = 0;
	//int (*pf[5])(int, int) = { NULL,&Add,&Sub,&Mul,&Div };
	do
	{
		menu();
		printf("请选择运算>:\n");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			cale(Add);
			break;
		case 2:
			cale(Sub);
			break;
		case 3:
			cale(Mul);
			break;
		case 4:
			cale(Div);
			break;
		case 0:
			printf("退出程序\n");
			break;
		default:
			printf("选择错误\n");
			break;
		}	
	}while (input);
	return 0;
}
